home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / sync / symm.md / Sync_Unlock.s < prev   
Text File  |  1990-08-10  |  2KB  |  86 lines

  1. /*
  2.  * syncAsm.s --
  3.  *
  4.  *    Source code for the Sync_Unlock library procedure.
  5.  *
  6.  * Copyright 1988 Regents of the University of California
  7.  * Permission to use, copy, modify, and distribute this
  8.  * software and its documentation for any purpose and without
  9.  * fee is hereby granted, provided that the above copyright
  10.  * notice appear in all copies.  The University of California
  11.  * makes no representations about the suitability of this
  12.  * software for any purpose.  It is provided "as is" without
  13.  * express or implied warranty.
  14.  */
  15.  
  16.     .data
  17.     .asciz "$Header: Sync_Unlock.s 1.2 90/03/05 $ SPRITE (Berkeley)"
  18.     .align 2
  19.     .text
  20.  
  21. /* $Log:    Sync_Unlock.s,v $
  22.  * Revision 1.2  90/03/05  14:42:30  rbk
  23.  * Add call to Sync_SlowBroadcast() if "waiting".
  24.  * Cleaned up a bit (use # in line comments), and loose save/restore of
  25.  * scratch registers.
  26.  * 
  27.  * Revision 1.1  90/03/05  10:13:44  rbk
  28.  * Initial revision
  29.  *  
  30.  * Based on Sync_Unlock.s,v 1.1 88/06/19 14:34:19 ouster
  31.  */
  32.  
  33. #include "kernel/machAsmDefs.h"
  34.  
  35.  
  36. /*
  37.  *----------------------------------------------------------------------------
  38.  *
  39.  * Sync_Unlock --
  40.  *
  41.  *      Release a lock.  This is called at the end of a critical
  42.  *      section of code to allow other processes to execute within the
  43.  *      critical section.  If any processes are waiting to acquire this
  44.  *      lock they are made runnable.  They will try to gain the lock
  45.  *      again the next time they run.
  46.  *
  47.  * Results:
  48.  *    None.
  49.  *
  50.  * Side effects:
  51.  *    The lock is cleared.  Processes waiting on the lock are made runnable.
  52.  *
  53.  * C equivalent:
  54.  *
  55.  *    void
  56.  *    Sync_Unlock(lockPtr)
  57.  *        Sync_Lock *lockPtr;
  58.  *    {
  59.  *        lockPtr->inUse = 0;
  60.  *        if (lockPtr->waiting) {
  61.  *        Sync_SlowBroadcast((int)lockPtr, &lockPtr->waiting);
  62.  *        }
  63.  *    }
  64.  *
  65.  *----------------------------------------------------------------------------
  66.  */
  67.  
  68. ENTRY(Sync_Unlock)
  69.     movl    SPARG0, %ecx        # ecx = lockPtr.
  70.     xorl    %eax, %eax        # eax = 0
  71.     xchgl    %eax, (%ecx)        # release the lock
  72.     cmpl    $0, 4(%ecx)        # is waiting set?
  73.     jne    1f            # yup -- call kernel
  74.     RETURN                # nope; done.
  75.     /*
  76.      * Note the broadcast semantics for Sync_SlowBroadcast.
  77.      * All processes waiting on the lock will be made runnable,
  78.      * however, all but one will sleep again inside Sync_SlowLock.
  79.      */
  80. 1:    leal    4(%ecx), %eax        # push ...
  81.     pushl    %eax            #    &(lockPtr->waiting)
  82.     pushl    %ecx            # lockPtr (event)
  83.     CALL    _Sync_SlowBroadcast    # Sync_SlowBroadcast(lockPtr, &waiting)
  84.     addl    $8, %esp        # clear stack.
  85.     RETURN                # done.
  86.